/**
 * name:zepto.cityPlus.js
 * author:jaypha 2015.04.14
 * qq:168007694
 * email:psufool@163.com
 */
 ;(function($){
 	$.fn.cityPlus = function(options){
 		var optDefault = {
 			eldom:'.cityPlusCon', // 触发dom
 			disabledCity:false, // 不显示城市，默认为false，当为true时只显示省份
 			disabledArea:false, // 不显示区/县，当disabledCity为true时，这个参数不起作用
 			hideSiblings:false, // 是否隐藏控件同级兄弟元素，默认为false,不隐藏
 			searchInputFocus:false, // 当控件初始化完成时，搜索框是否获取焦点，默认为不获取
 			backControl:'close', // 后退功能，默认为关闭
 			splitChar:'', // 返回时，省市区或县的间隔符号，默认为空
 			plusTemplates:null, // 模板文件路径（包含模板文件的文件名）
 			inputNameCom:'', // input的控制层,默认为空时，则是控件层
 			inputNameProvinceCode:'provinceCode', // 省份代码ID
 			inputNameProvinceName:'provinceName', // 省份名称ID
 			inputNameCityCode:'cityCode', // 城市代码ID
 			inputNameCityName:'cityName', // 城市名称ID
 			inputNameAreaCode:'areaCode', // 区或县代码ID
 			inputNameAreaName:'areaName', // 区或县名称ID
 			data:null,
 			zindex:999, // 控件控制层的层级
 			initBefore:function(oBject){}, // 控件初始化前触发的事件
 			initAfter:function(oBject){}, // 控件初始化结束触发的事件
 			provinceSelect:function(oBject){}, // 选择省份触发的事件
 			citySelect:function(oBject){}, // 选择城市触发的事件
 			areaSelect:function(oBject){}, // 选择区或县触发的事件
 			close:function(oBject){}, // 关闭事件
 			callback:function(oBject){} // 所有事件完成后触发的事件
 		};/*oBject:为控件对象本身*/

 		var opts = $.extend(optDefault,options);
 		var cityPlus = $(this);
 		var _this = null;
 		var oCityPlus = {
 			// 复制对象
 			clone:function(obj){
 				var o;
 				switch(typeof obj){
 					case 'undefined':break;
 					case 'string':o = obj + ''; break;
 					case 'number':o = obj - 0; break;
 					case 'boolean':o = obj; break;
 					case 'object':
 						if(obj===null){
 							o = null;
 						}else{
 							if(obj instanceof Array){
 								o = [];
 								for(var i=0,len=obj.length;i<len;i++){
 									o.push(_this.clone(obj[i]));
 								}
 							}else{
 								o = {};
 								for(var k in obj){
 									o[k] = _this.clone(obj[k]);
 								}
 							}
 						}
 						break;
 					default:
 						o = obj; break;
 				}
 				return o;
 			},
 			init:function(){
 				_this = this;
 				_this.$el = _this.clone(cityPlus);
 				_this.opts = _this.clone(opts);
 				_this.wrap = _this.$el.selector;
 				if(!_this.opts.inputNameCom || _this.opts.inputNameCom==''){
 					_this.opts.inputNameCom = _this.wrap;
 				}
 				_this.pcaDefaultIndex = {
 					province:-1,
 					city:-1,
 					area:-1
 				};
 				cityPlus = null;
 				opts = null;
 				// 调用初始化前方法
 				_this.opts.initBefore(_this);
 				setTimeout(function(){
 					// 初始化表单元素
 					_this.initPlusInputElement();
 					_this.searchData = Array();
	 				// 判断是否传入省市区数据
	 				if(_this.opts.data){
	 					var oPCA = Array();
	 					for(i=0;i<_this.opts.data.length;i++){
	 						oPCA.push({
	 							code:_this.opts.data[i].a,
	 							name:_this.opts.data[i].b,
	 							item:Array(),
	 						});
	 						if(_this.opts.disabledCity){
	 							_this.searchData.push({
	 								code:_this.opts.data[i].a,
	 								name:_this.opts.data[i].b
	 							});
	 						}
	 						for(j=0;j<_this.opts.data[i].c.length;j++){
	 							oPCA[i].item.push({
	 								code:_this.opts.data[i].c[j].d,
	 								name:_this.opts.data[i].c[j].e,
	 								item:Array()
	 							});
	 							if(!_this.opts.disabledCity && _this.opts.disabledArea){
	 								_this.searchData.push({
	 									provinceCode:_this.opts.data[i].a,
	 									provinceName:_this.opts.data[i].b,
	 									code:_this.opts.data[i].c[j].d,
	 									name:_this.opts.data[i].c[j].e
	 								});
	 							}
	 								
	 							if(!_this.opts.disabledArea && _this.opts.data[i].c[j].g){
		 							for(k=0;k<_this.opts.data[i].c[j].g.length;k++){
		 								oPCA[i].item[j].item.push({
		 									code:_this.opts.data[i].c[j].g[k].h,
		 									name:_this.opts.data[i].c[j].g[k].i
		 								});
		 								if(!_this.opts.disabledCity && !_this.opts.disabledArea){
			 								_this.searchData.push({
			 									provinceCode:_this.opts.data[i].a,
			 									provinceName:_this.opts.data[i].b,
			 									cityCode:_this.opts.data[i].c[j].d,
			 									cityName:_this.opts.data[i].c[j].e,
			 									code:_this.opts.data[i].c[j].g[k].h,
			 									name:_this.opts.data[i].c[j].g[k].i
			 								});
										}
		 							}
	 							}
	 						}
	 					}
	 					_this.opts.data = _this.clone(oPCA);
	 					oPCA = null;
	 					// 加载插件模板
	 					_this.loadTemplate();
	 					// 绑定事件
		 				_this.bind();
		 				// 调用初始化后方法
		 				_this.opts.initAfter(_this);
	 				}
 				},100);
 			},
 			// 初始化控件表单元素
 			initPlusInputElement:function(){
 				// 判断是否存在控件控制对象，如果不存在，则自动创建
				if($(_this.wrap).length==0){
					if(_this.wrap.indexOf('#')!=-1){
						$('body').append('<div id="' + _this.wrap.replace('#','') + '"></div>');
					}else if(_this.wrap.indexOf('.')!=-1){
						$('body').append('<div class="' + _this.wrap.replace('.','') + '"></div>');
					}
				}
 			},
 			// 创建表单隐藏载
 			createInputs:function(){
 				_this.elInputs = Array();
 				if($('#' + _this.opts.inputNameProvinceCode,$(_this.opts.inputNameCom)).length==0){
 					_this.elInputs.push('<input type="hidden" name="'+_this.opts.inputNameProvinceCode+'" id="'+_this.opts.inputNameProvinceCode+'" value="" />');	
 				}
 				if($('#' + _this.opts.inputNameProvinceName,$(_this.opts.inputNameCom)).length==0){
 					_this.elInputs.push('<input type="hidden" name="'+_this.opts.inputNameProvinceName+'" id="'+_this.opts.inputNameProvinceName+'" value="" />');
 				}
 				if(!_this.opts.disabledCity){
 					if($('#' + _this.opts.inputNameCityCode,$(_this.opts.inputNameCom)).length==0){
 						_this.elInputs.push('<input type="hidden" name="'+_this.opts.inputNameCityCode+'" id="'+_this.opts.inputNameCityCode+'" value="" />');
 					}
 					if($('#' + _this.opts.inputNameCityName,$(_this.opts.inputNameCom)).length==0){
 						_this.elInputs.push('<input type="hidden" name="'+_this.opts.inputNameCityName+'" id="'+_this.opts.inputNameCityName+'" value="" />');
 					}
 					if(!_this.opts.disabledArea){
	 					if($('#' + _this.opts.inputNameAreaCode,$(_this.opts.inputNameCom)).length==0){
	 						_this.elInputs.push('<input type="hidden" name="'+_this.opts.inputNameAreaCode+'" id="'+_this.opts.inputNameAreaCode+'" value="" />');
	 					}
	 					if($('#' + _this.opts.inputNameAreaName,$(_this.opts.inputNameCom)).length==0){
	 						_this.elInputs.push('<input type="hidden" name="'+_this.opts.inputNameAreaName+'" id="'+_this.opts.inputNameAreaName+'" value="" />');
	 					}
	 				}
 				}
 				$(_this.opts.inputNameCom).append(_this.elInputs.join(''));
 				_this.$els = {
 					provinceCode:$('#'+_this.opts.inputNameProvinceCode,$(_this.opts.inputNameCom)),
 					provinceName:$('#'+_this.opts.inputNameProvinceName,$(_this.opts.inputNameCom))
 				};
 				_this.pcaDefaultValue = {
 					provinceCode:_this.$els.provinceCode.val(),
 					provinceName:_this.$els.provinceName.val()
 				};
 				if(!_this.opts.disabledCity){
 					_this.$els = $.extend(_this.$els,{
 						cityCode:$('#'+_this.opts.inputNameCityCode,$(_this.opts.inputNameCom)),
 						cityName:$('#'+_this.opts.inputNameCityName,$(_this.opts.inputNameCom))
 					});
 					_this.pcaDefaultValue = $.extend(_this.pcaDefaultValue,{
 						cityCode:_this.$els.cityCode.val(),
 						cityArea:_this.$els.cityName.val()
 					});
 					if(!_this.opts.disabledArea){
	 					_this.$els = $.extend(_this.$els,{
	 						areaCode:$('#'+_this.opts.inputNameAreaCode,$(_this.opts.inputNameCom)),
	 						areaName:$('#'+_this.opts.inputNameAreaName,$(_this.opts.inputNameCom))
	 					});
	 					_this.pcaDefaultValue = $.extend(_this.pcaDefaultValue,{
	 						cityCode:_this.$els.areaCode.val(),
	 						cityArea:_this.$els.areaName.val()
	 					});
	 				}
 				}
 			},
 			// 加载模板
 			loadTemplate:function(){
				// 当全局配置文件和初始化中未配置模板路径，设置默认的模板文件
				if(!App.tplUrls.cityPlus && !_this.opts.plusTemplates){
					_this.opts.plusTemplates = App.allHost + App.child_dir + 'tpl/cityPlus.html';
				}
				// 加载模板文件
				$(_this.wrap).load(_this.opts.plusTemplates, _.bind(function(){
					loadJs([App.completeUrls.touch,App.completeUrls.scroll,App.completeUrls.box], _.bind(function(index) {
			            if(index == 3) {
			                // 加载完毕
			                _this.dealData();
			                // 绑定事件
							_this.dealBind();
			            }
			        }, _this), true);
				}),_this).hide();
 			},
 			// 渲染页面
 			dealData:function(){
 				// 创建隐藏元素
 				_this.createInputs();
 				// 初始化省份
				_this.initProvince();
				//callback
				_this.opts.callback();
 			},
 			// 省份初始化
 			initProvince:function(){
 				var arrProvince = Array();
				arrProvince.push('<ul>');
				for(i=0,len=_this.opts.data.length;i<len;i++){
					arrProvince.push('<li code="'+_this.opts.data[i].code+'" class="province_' + _this.opts.data[i].code + '" name="'+_this.opts.data[i].name+'" idx="'+i+'" item-type="province">'+_this.opts.data[i].name+'</li>');
				}
				arrProvince.push('</ul>');
				$('.pca-com > dd',$(_this.wrap)).empty().append(arrProvince.join('')).find('.province_'+_this.$els.provinceCode.val()).addClass('sel');
				_this.pcaBind();
 			},
 			// 城市初始化
 			initCity:function(){
 				if(_this.pcaDefaultIndex.province>-1){
 					var arrCity = Array();
 					var cityList = _this.opts.data[_this.pcaDefaultIndex.province].item;
 					for(i=0,len=cityList.length;i<len;i++){
 						arrCity.push('<li code="'+cityList[i].code+'" class="city_'+cityList[i].code+'" name="'+cityList[i].name+'" idx="'+i+'" item-type="city">'+cityList[i].name+'</li>');
 					}
 					$('.pca-com > dd',$(_this.wrap)).empty().append(arrCity.join('')).find('.city_'+_this.$els.cityCode.val()).addClass('sel');
	 				_this.pcaBind();
 				}
 			},
 			// 区或县初始化
 			initArea:function(){
 				if(_this.pcaDefaultIndex.city>-1){
 					var arrArea = Array();
 					var areaList = _this.opts.data[_this.pcaDefaultIndex.province].item[_this.pcaDefaultIndex.city].item;
 					for(i=0,len=areaList.length;i<len;i++){
 						arrArea.push('<li code="'+areaList[i].code+'" class="area_'+areaList[i].code+'" name="'+areaList[i].name+'" idx="'+i+'" item-type="area">'+areaList[i].name+'</li>');
 					}
 					if(arrArea.length==0) return false;
 					$('.pca-com > dd',$(_this.wrap)).empty().append(arrArea.join('')).find('.area_'+_this.$els.areaCode.val()).addClass('sel');
	 				_this.pcaBind();
 				}
 			},
 			// 省市区事件绑定
 			pcaBind:function(){
 				$('.pca-com > dd',$(_this.wrap)).find('li').on({
 					singleTap:function(e){
 						if(!$(this).hasClass('sel')){
 							$(this).addClass('sel').siblings().removeClass('sel');	
 						}
 						var itemType = $(this).attr('item-type');
						var itemVal = {
							code:$(this).attr('code'),
							idx:$(this).attr('idx'),
							name:$(this).attr('name')
						};
						switch(itemType){
							case 'province':
								_this.$els.provinceCode.val(itemVal.code);
								_this.$els.provinceName.val(itemVal.name);
								$('.pca-com > dt',$(_this.wrap)).html(itemVal.name).removeClass('hide').show();
								_this.pcaDefaultIndex.province = itemVal.idx
								if(!_this.opts.disabledCity){
									_this.$els.cityCode.val('');
									_this.$els.cityName.val('');
									if(!_this.opts.disabledArea){
										_this.$els.areaCode.val('');
										_this.$els.areaName.val('');
									}
									_this.initCity();
									_this.opts.provinceSelect(_this);
								}else{
									_this.opts.provinceSelect(_this);
									_this.close();
								}
								break;
							case 'city':
								_this.$els.cityCode.val(itemVal.code);
								_this.$els.cityName.val(itemVal.name);
								_this.pcaDefaultIndex.city = itemVal.idx;
								if(_this.$els.provinceName.val()!=itemVal.name){
									$('.pca-com > dt',$(_this.wrap)).html(_this.$els.provinceName.val() + _this.opts.splitChar + itemVal.name);
								}
								if(!_this.opts.disabledArea){
									_this.$els.areaCode.val('');
									_this.$els.areaName.val('');
									_this.initArea();
									_this.opts.citySelect(_this);
									var areaList = _this.opts.data[_this.pcaDefaultIndex.province].item[_this.pcaDefaultIndex.city].item;
									if(areaList.length==0){
										_this.close();
									}
								}else{
									_this.close();
								}
								break;
							case 'area':
								_this.$els.areaCode.val(itemVal.code);
								_this.$els.areaName.val(itemVal.name);
								_this.pcaDefaultIndex.area = itemVal.idx;
								$('.pca-com > dt',$(_this.wrap)).html(_this.$els.provinceName.val() + _this.opts.splitChar + _this.$els.cityName.val() + _this.opts.splitChar + itemVal.name);
								_this.opts.areaSelect(_this);
								_this.close();
								break;
						}
 					}
 				});
 			},
 			// 绑定模板
 			dealBind:function(){
 				$('.back',$(_this.wrap)).on({
 					singleTap:function(e){
 						if(_this.opts.backControl=='close'){
 							_this.close();
 						}else{
	 						var itemType = $('.pca-com > dd li',$(_this.wrap)).eq(0).attr('item-type');
	 						switch(itemType){
	 							case 'province':
	 								_this.close();
	 								break;
	 							case 'city':
	 								_this.initProvince();
	 								break;
	 							case 'area':
	 								_this.initCity();
	 								break;
	 						}
	 					}
 						/*$(_this.wrap).removeClass('default_city_plus_wrap').hide();
 						_this.setBodyStyle();*/
 					}
 				});
 				$('.sear input',$(_this.wrap)).on({
 					change:function(e){
 						console.log(this.value);
 					}
 				});
 			},
 			// 设置body标签样式
 			setBodyStyle:function(hidenOverFlowY){
 				if(hidenOverFlowY){
 					$('body').css({
						'overflow-y':'hidden'
					});
 				}else{
 					$('body').css({
 						'overflow-y':'auto'
 					});
 				}
 			},
 			// 控件事件绑定
 			bind:function(){
 				// 触发dom单击事件
 				$(_this.opts.eldom).on({
 					singleTap:function(e){
 						_this.setBodyStyle(true);
 						$(_this.wrap).addClass('default_city_plus_wrap').css({
 							'z-index':_this.opts.zindex
 						}).show();
 						if(!_this.opts.headHeight){
 							_this.opts.headHeight = $('.head',$(_this.wrap)).height() + $('.sear',$(_this.wrap)).height();
 							_this.otgTitleHeight = $('.pca-com > dt',$(_this.wrap)).height();
 						}
 						var txtPlaceholder = '';
 						if(_this.opts.disabledCity){
 							txtPlaceholder = '搜索省份/自治区/直辖市';
 						}else if(_this.opts.disabledArea){
 							txtPlaceholder = '搜索城市';
 						}else{
 							txtPlaceholder = '搜索区/县';
 						}
 						$('.sear input',$(_this.wrap)).attr('placeholder',txtPlaceholder);
 						var pcaHeight = (document.documentElement.clientHeight - _this.opts.headHeight - _this.otgTitleHeight) + 'px';
 						$('.pca-com > dd',$(_this.wrap)).css({
							height:pcaHeight,
							'overflow-y':'auto'
						});
 					}
 				});
 				// 搜索框
 				/*$('.sear input',$(_this.wrap)).on({
 					change:function(e){
 						if($.trim(this.value).length==0){

 						}
 					}
 				});*/
 			},
 			// 关闭
 			close:function(){
 				_this.setBodyStyle();
 				if(_this.$els.provinceCode.val().length>0){
	 				var tmptxt = _this.$els.provinceName.val();
	 				if(!_this.opts.disabledCity){
	 					if(_this.$els.provinceName.val()!=_this.$els.cityName.val()){
	 						tmptxt += _this.opts.splitChar + _this.$els.cityName.val();
	 					}
	 					if(!_this.opts.disabledArea && _this.$els.areaName.val().length>0){
	 						tmptxt += _this.opts.splitChar  + _this.$els.areaName.val();
	 					}
	 				}
	 				$(_this.opts.eldom).text(tmptxt).val(tmptxt);
 				}else{
 					_this.opts.close(_this);
 				}

				if(_this.opts.backControl=='close'){
					_this.initProvince();
					$('.pca-com > dt',$(_this.wrap)).html('').addClass('hide');
				}
 				$(_this.wrap).hide();
 			}
 		};
 		return oCityPlus.init();
 	};
 })(Zepto);